關於Server建置部分,我們會使用AWS的EC2服務來說明,並試著將我們的之前做好的商品系統
給push上去,再藉由建置好的EC2主機來開啟專案。好讓API URL不在是由localhost
的本地端運行,而是透過一個Host
來運行。
後端語言:Node.js
OS(local): Mac OS
OS(remote): Ubuntu
首先,我們得要去註冊一個AWS的帳號(廢話)。待註冊好後,我們先進入到EC2的頁面,可以看到左手邊一系列的選項可選,我們先選擇Instances
的選項。
註記:EC2的服務可以讓我們免費試用一年,不過適用的主機也只有最低階配備能使用,但已經足夠讓我們來嘗試架設一台Server了。
之後點選Launch Instance
來開始選擇我們要建置什麼主機:
這些OS都是Amazon Machine Image(AMI)選項。AMI是Amazon預先設定的伺服器範本,在選單中的每個AMI都預設好一個作OS,可以想像成Amazon已經幫我們安裝好OS,我們只要選擇所想要使用的OS即可。
先點選Free tier only
的選項,該選項會顯示為所有免費可選的主機,之後我們選擇一個ubuntu
Server的主機。最後,點選Select
來接續下一步。
在該頁面能看到有CPU, Memory, Storage...等。也就是主機的配備設定,但這部分由於我們是使用免費專案,所以直接點選有免費專案的選項即可。最後,再選擇Review and Launch
往下一步走。
最後,我們可以在該頁面中看到之前設定好的內容。但之前的設定其實都是以免費方案為主,唯一能讓我們思考的也只有AMI的不同。待確定後,就選取Lanunch
來跳到下一步動作。
這部分意思是要我們用SSH的方式來進行登入。
註記:關於SSH(Secure Shell),它是一種安全的網路傳輸協定,它給Client端及Server端之間開啟一個安全的tunnel,所有需要傳輸的指令或資料都可以透過這個tunnel來進行傳遞。SSH最常用在這種遠端登入的服務,它的運作原理是產生一組
key pairs
分成公鑰及私鑰。私鑰會留在Client端,公鑰會放在Server端,當今天有用戶想要登入到Server端時,只要驗證這個私鑰可以解開公鑰,那用戶就能登入該Server端。換個例子說明,想像成公鑰是一把鎖,而私鑰則是一把鑰匙,這鑰匙與鎖的關係讀者應該就不難想像了。
接著選擇Create a new key pair
的選項,並為這個Key pair取個你所喜歡的名稱後再按下Download Key Pair
的選項。當按下後就會把私鑰給下載下來了。下載後再按下Launch Instances
來啟動Server。
註記:Key Pair的私鑰檔案為唯一,若將它遺失就不能在登入該Server了。另外,若是別人擁有這把私鑰也能夠登入到該Server,請小心保存。
就能看到整個Server啟動後的狀態,最後按下View Instance
就能回到一開始的Instance
列表的頁面。
由於筆者的OS是MacOS
所以這部分的說明會以這OS為主(但Linux也適用)。
我們先將私鑰的pem檔案移動到.ssh
的資料夾中,先找到我們剛剛下載下來的檔案,並輸入:
$ mv ~/Downloads/PenguinRun.pem ~/.ssh/PenguinRun.pem
這部分筆者的pem
是放在Downloads裡面,所以只要輸入mv
指令,就能將該檔案移動到.ssh
的資料夾中。
為了確保私鑰不會被檢視,我們先使用chmod
指令來更改該檔案的權限。
$ chmod 400 ~/.ssh/PenguinRun.pem
之後,我們輸入指令ls -l
來檢視該檔案的權限是否已經被變更。
$ ls -l
結果能看到:
註記:chmod 400意思是這個檔案Read by owner,也就是只有使用者本身才能看到。
先到Instance介面來看我們主機的IP是多少,可至紅圈部分來看或直接複製起來也行,待會登入會用到。
之後,我們輸入下述指令:
$ ssh -i "PenguinRun.pem" ubuntu@ec1-111-111-111-111.ap-northeast-1.compute.amazonaws.com
註記:111-111-111-111為示範IP。讀者輸入自己EC2上的IP
屆時會出現一個問題:
The authenticity of host 'ec2-111-111-111-111.ap-northeast-1.compute.amazonaws.com (111-111-111-111)' can't be established.
ECDSA key fingerprint is...
Are you sure you want to continue connecting (yes/no)? yes
我們只要輸入yes後,就可以登入到我們主機了。
再來就跟我們在關於後端觀念(四)-怎麼建立後端開發環境所描述的動作差不多,也就是安裝Node.js
並將我們放置在github
的專案給git clone
下來即可。
這部分我們就根據Node.js官網所說的在ubuntu
環境下安裝的方式進行。首先,先輸入指令:
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
待執行完成後就會出現:
## Run `apt-get install nodejs` (as root) to install Node.js v8.x and npm
也就是我們只要再輸入下列指令,就安裝完成。
sudo apt-get install -y nodejs
最後,我們在輸入下列指令來看是否有安裝完成:
$ node --version
v.8.9.4
我們先按pwd
指令來確定目前的位置在哪邊:
$ pwd
/home/ubuntu
於是發現我們目前在/home/ubuntu
的資料夾中,我們先用cd ..
指令回到/home
的目錄中。
$ cd ..
之後,在建立一個屬於可以代表我們使用者的資料夾來做運用:
$ mkdir PenguinRun
mkdir: cannot create directory ‘PenguinRun’: Permission denied
註記:筆者這部分以PenguinRun的使用者資料夾來做說明。
但這時會出現權限不足的問題,接續我們在使用sudo
的權限來設置,並使用ls
的指令來檢查:
$ sudo mkdir PenguinRun
$ ls
PenguinRun ubuntu
當設置完成後,我們就以PenguinRun
來當基底,並整理出所有任何你想放置的東西。
這步驟就是將我們先前所做好的商品系統
匯入到這台Server中。首先,先將我們在git的url複製下來並使用git clone
的指令來將整個專案匯入。
$ git clone <git url>
待匯入後先輸入npm install
來將整個專案所使用到的package給安裝進去。
$ npm install
待安裝後,就使用npm start
來啟動整個專案。
$ npm start
但若是讀者是按照筆者之前所說的去實作整個商品系統的話,通常會發現到會出現個connection error
的回覆,這是因為我們資料庫當初是建置在local也就是本地端的主機上。所以,若是讀者想要在該環境上使用該資料庫,等同於還要再額外設定資料庫才行。但這部分的操作,筆者就不多做說明。
所以,我們換個方式來測試看看要怎在Sever上開啟API。
由於,我們已經安裝好Node.js
,所以換個角度想我們直接寫個最簡單的hello world
且HTTP method為GET
就行。從Server上輸入nano sample.js
來直接進行撰寫:
//引入node的http模組。
const http = require("http");
//定義個function來處理即將到來的http request.
requestHandler = (request, response) => {
// 回傳JSON格式的response訊息
const json = JSON.stringify({
say: "hi",
});
response.end(json);
}
//使用http模組來建立一個server,並使用上述定義的function來處理request.
const server = http.createServer(requestHandler);
//啟動server並使用3333的port.
server.listen(3333);
待撰寫結束後按ctrl + x
離開,並會詢問是否儲存檔案,這時選則y
即可。在接續使用ls
指令來看是否有成功建置。
$ ls
sample.js
之後,使用node sample.js
指令來啟用該檔案。
$ node sample.js
最後,開啟瀏覽器並輸入111-111-111-111:3333
會發現不管怎麼連都連不上。沒關係,代表我們還有地方還未設定到。
我們再回到AWS EC2
的部分,先至Elastic IPs
選項,並點選Allocate New Address
鈕來建立一個新的IP。
註記:這是因為EC2的主機若要讓外人能夠連接,還需要額外設定個彈性IP來使用。
按下Allocate
按鈕後,就會給我們一個新的IP做使用,最後再按Close
離開。
接續點選新增過後的Elastic IP
並在上面的Actions
中選擇Associate address
。
再來,在Instance
中選擇我們之前剛建立好的Instance,接續Private IP
選擇相對應的IP,最後按下Associate
按鈕。
但這時會發現我們一開始的Server IP也會隨著Elastic IP
而改變。等同於我們起初所登入的111-111-111-111
也會跟著改變成222-222-222-222
,假如讀者目前還在主機上,也會被強制登出。
註記:
222-222-222-222
將比喻成新的Server IP。
但我們還是可以拿取一開始所拿到的私鑰來進行登入,但讀者就得要將登入的IP換成是我們剛剛轉換好的222-222-222-222
來做登入。
接續,我們一樣回到撰寫測試程式碼
,再次測試看看能不能使用Server IP來開啟API。照步驟到最後,發現還是不行,那該怎麼辦呢?沒關係,我們在設置最後一個東西就可以了!(真的是最後)
一樣回到AWS EC2
的部分,選取Security Group
按鈕,並選擇我們剛剛所建立好的Server,再來選擇Inbound
選項的Edit
按鈕。
之後,選擇Add Rule
並在Type項目中選擇Custom TCP
,並在Post Range寫入剛剛在撰寫測試程式碼
部分的port(3333)。最後點選Save
離開。
最後的最後(真的是最後了)開啟我們的專案:
$ node sample.js
開啟隨便個瀏覽器,並輸入API URL還有指定的port就能看到我們成功了!
讀者在這一連串的設定後,不知道對於Server的建置有沒有更加了解呢?筆者在這部分是選用AWS EC2
服務來說明,但其他還有像google的Google Cloud Platform
服務也可以玩,都是一年內免費。關於Server建置的議題還有「HTTPS設定」、「reverse proxy」...等。好多好多議題可以研究。若讀者對Server建置有興趣,不仿去研究看看這些。後續我們將進入到進階實作
的部分。